package org.hxyjs.controller;

import org.hxyjs.dto.DTO;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO;
import org.apache.shiro.subject.Subject;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;

/****
 * 用户登录Controller
 *
 * @author Swinglife
 *
 */
//@RestController
public class LoginController {

    @Resource
    EnterpriseCacheSessionDAO sessionDao;

//	@GetMapping(value = "/")
//	public DTO home(Model model){
//		System.out.println("默认根目录");
//		DTO dto = new DTO(302,"登录成功","home");
//		return dto;
//	}

    /***
     * 告诉用户跳转到登录页面
     *
     * @return
     */
    @GetMapping(value = "/login")
    public DTO show(Model model) {
        DTO dto = new DTO(302, "login.html");
        return dto;
    }

    /**
     * @param username
     * @param password
     * @param rememberMe
     * @param modelName  传递当前是什么模块的用户登录 例如 会员 member 自定义的realm 需要知道调用什么的service 要靠这个 字符串
     * @return
     */
    @PostMapping(value = "/login")
    public DTO Login(String username, String password, String rememberMe, String modelName) {
        System.out.println(username + "--------------------1111 " + password + " " + rememberMe + "  ----- " + modelName);

        Subject subject = SecurityUtils.getSubject();//通过安全工具 得到一个子项目
//令牌 账号密码令牌   根据mac地址等硬件算出特殊字符串 私人令牌   公钥 私钥
        subject.getSession().setAttribute("modelName", modelName);//此处存放的字符串 realm要用
        UsernamePasswordToken token = new UsernamePasswordToken();
        token.setUsername(username);
        token.setPassword(password.toCharArray());
//		token.setModelName(modelName);

        //禁止已登录用户
//		Collection<Session> sessions = sessionDao.getActiveSessions();
//        for (Session session : sessions) {
//
//            System.out.println("登录用户" + session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY));
//            if (session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY) != null) {
//                return  new ModelAndView("accountlogin", "msg", "该用户已登录");
//            }
//        }


        boolean remembermeRusult = rememberMe == null ? false : true; // null=>false
        if (remembermeRusult) {// 如果用户提交的remmbermeResult为true 保存到令牌中
            token.setRememberMe(remembermeRusult);
        }
        String error = null;
        try {
            subject.login(token);//子项目登录  登录正确就会报异常
        } catch (UnknownAccountException e) {
            error = "用户名错误";
        } catch (IncorrectCredentialsException e) {
            error = "用户名/密码错误";
        } catch (ExcessiveAttemptsException e) {
            // TODO: handle exception
            error = "登录失败多次，账户锁定10分钟";
        } catch (AuthenticationException e) {
            // 其他错误，比如锁定，如果想单独处理请单独catch处理
            e.printStackTrace();
            error = "其他错误：" + e.getMessage();
        }
        DTO dto = new DTO();
        dto.setCode(302);//重定向 原来资源还在
        System.out.println("登录出错出错信息为;" + error);

        if (error != null) {// 出错了，返回登录页面
            dto.setMsg(error);
            dto.setUrl("accountlogin");
        } else {// 登录成功
            System.out.println("0000000000000999" + subject.getSession().getAttribute("user"));
            dto.setCode(200);
            dto.setMsg("登录成功1");
            dto.setUrl("home");
            dto.setT(subject.getSession().getAttribute("user"));
        }
        return dto;
    }


    @RequestMapping("/logout")
    public void logout(HttpServletResponse response) {
        Subject lvSubject = SecurityUtils.getSubject();
        lvSubject.logout();
        response.setStatus(302);
        //response.setStatusCode(HttpStatus.FOUND);
    }


}